
// 内部创建一个 Map 来映射元数据的值
const metadataMap = new Map()


/**
 * 保存元数据 基本实现
 * @param key 元数据键
 * @param value 元数据值
 * @param target 对象
 * @param propertyKey 属性
 */
function defineMetadata(key, value, target, propertyKey) {
  if (!metadataMap.has(target)) { // 如果没有保存 target
    metadataMap.set(target, new Map()) // target 作为 key 值是 new Map 保存到 metadataMap 中
  }
  // 获取 target 的 Map 对象
  const targetMetadata = metadataMap.get(target)

  if (!targetMetadata.has(propertyKey)) { // Map 里面没有 propertyKey
    targetMetadata.set(propertyKey, new Map()) // propertyKey 作为 key 值是 new Map 保存到 targetMetadata 中
  }

  // 获取 targetMetadata 中 propertyKey 的 map
  const propertyKeyMetadata = targetMetadata.get(propertyKey)

  // 保存 元数据和元数据对象的值
  propertyKeyMetadata.set(key, value)

}